home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks96 / FlyPaper.sit / Fly Paper / FlyPaper Source / (Old Sources) / ClippingFile.cpp next >
Text File  |  1996-06-22  |  8KB  |  336 lines

  1. /*
  2. **    This file is for creating and using Finder clipping files.  Note that the Finder gets
  3. **    pretty pissed if the clipping type is one other than it would create itself.
  4. **
  5. */
  6.  
  7. #ifndef CLIPPINGFILE_H
  8. #include "ClippingFile.h"
  9. #endif
  10.  
  11. #ifndef FLYPAPERUTILS_H
  12. #include "FlyPaperUtils.h"
  13. #endif
  14.  
  15. #include "ST_MacClasses.h"
  16.  
  17. #include <folders.h>
  18. #include <TextUtils.h>
  19.  
  20. DragSendDataUPP        gMySendDataProc;
  21.  
  22. OSErr    CreateClippingFile (short *fRefNum, OSType fileType, FlyPaperAuxDataHandle& auxData, ClippingID& clippingID)
  23. {
  24.     ST_ResFileSaver        resFileSaver (CurResFile ());
  25.     
  26.     *fRefNum = 0;
  27.  
  28.     static Boolean    initedRandom = false;    
  29.     long    dirID;
  30.     short    vRefNum;
  31.     OSErr    error = FlyPaperFindFolder (kOnSystemDisk, kClippingsFolder, true, &vRefNum, &dirID);
  32.     
  33.     if (error)
  34.         return error;
  35.  
  36.     if (!initedRandom) {
  37.         GetDateTime ((unsigned long*) &qd.randSeed);
  38.         initedRandom = true;
  39.     }
  40.     
  41.     Str255            name;
  42.     do {
  43.         /* create a unique name */
  44.         do {
  45.             clippingID = ((long) Random () + ((long) Random () << 16)) & 0x7FFFFFFF;
  46.         } while (clippingID < 256);
  47.         NumToString (clippingID, name);
  48.         
  49.         error = HCreate (vRefNum, dirID, name, kClippingFileSignature, fileType);
  50.  
  51.     } while (error == dupFNErr);
  52.  
  53.     if (error)
  54.         return error;
  55.         
  56.     HCreateResFile (vRefNum, dirID, name);
  57.     
  58.     short            resFile = HOpenResFile (vRefNum, dirID, name, fsRdWrPerm);
  59.     
  60.     if (resFile < 0) {
  61.         CloseResFile (resFile);
  62.         HDelete (vRefNum, dirID, name);
  63.         return fnfErr;
  64.     }
  65.     
  66.     /* create the 'drag' resource header */
  67.     UseResFile (resFile);
  68.     DragResourceHeader        header = (DragResourceHeader) NewHandle (sizeof (DragResourceHeaderRec));
  69.     if (!header) {
  70.         CloseResFile (resFile);
  71.         HDelete (vRefNum, dirID, name);
  72.         return memFullErr;
  73.     }
  74.     
  75.     (**header).version = 0x00000001;
  76.     (**header).reserved1 = 0;
  77.     (**header).reserved2 = 0;
  78.     (**header).reserved3 = 0;
  79.     (**header).flavorCount = 0;
  80.     
  81.     AddResource ((Handle) header, kDragResourceResType, kDragResourceResID, "\p");
  82.     error = ResError ();
  83.     if (error) {
  84.         CloseResFile (resFile);
  85.         DisposeHandle ((Handle) header);
  86.         HDelete (vRefNum, dirID, name);
  87.         return error;
  88.     }
  89.     
  90.     /* create the special FlyPaper data */
  91.     auxData = (FlyPaperAuxDataHandle) NewHandle (sizeof (FlyPaperAuxDataRec));
  92.     if (!auxData) {
  93.         CloseResFile (resFile);
  94.         HDelete (vRefNum, dirID, name);
  95.         return memFullErr;
  96.     }
  97.     
  98.     AddResource ((Handle) auxData, kAuxDataResType, kAuxDataResID, name);
  99.     error = ResError ();
  100.     if (error) {
  101.         CloseResFile (resFile);
  102.         HDelete (vRefNum, dirID, name);
  103.         return error;
  104.     }
  105.     
  106.     *fRefNum = resFile;
  107.     return noErr;    
  108. }
  109.  
  110. OSErr    AddFlavorToClippingFile (short clippingRefNum, FlavorType flavorType, Handle flavorData)
  111. {
  112.     ST_ResFileSaver            resFileSaver (CurResFile ());
  113.     
  114.     UseResFile (clippingRefNum);
  115.     DragResourceHeader        header = (DragResourceHeader)
  116.                 Get1Resource (kDragResourceResType, kDragResourceResID);
  117.  
  118.     if (!header)
  119.         return resNotFound;
  120.     
  121.     DragResourceFlavorRec            flavorRec;
  122.     
  123.     flavorRec.flavorType = flavorType;
  124.     flavorRec.reserved1 = 0x00000100;
  125.     flavorRec.reserved2 = 0x00000000;
  126.     flavorRec.reserved3 = 0x00000000;
  127.  
  128.     AddResource (flavorData, flavorType, kFlavorResID, "\p");
  129.     OSErr    error = ResError ();
  130.     if (error)
  131.         return error;
  132.     
  133.     error = PtrAndHand (&flavorRec, (Handle) header, sizeof (flavorRec));
  134.     if (error)
  135.         return error;
  136.     
  137.     (**header).flavorCount++;
  138.     ChangedResource ((Handle) header);
  139.     
  140.     return noErr;
  141. }
  142.  
  143. OSErr OpenClippingFile (ClippingID id, short& fileRef)
  144. {
  145.     fileRef = 0;
  146.     FSSpec        spec;
  147.     
  148.     OSErr    error = FlyPaperFindFolder (kOnSystemDisk, kClippingsFolder, true, &spec.vRefNum,
  149.             &spec.parID);
  150.  
  151.     if (error)
  152.         return error;
  153.         
  154.     NumToString (id, spec.name);
  155.  
  156.     ST_ResFileSaver         resSaver (CurResFile ());
  157.     fileRef = FSpOpenResFile (&spec, fsCurPerm);
  158.  
  159.     if (fileRef < 0)
  160.         return ResError ();
  161.     else
  162.         return noErr;        
  163. }
  164.  
  165. OSErr GetClippingFileAuxData (ClippingID id, FlyPaperAuxDataHandle& data)
  166. {
  167.     short        fileRef = 0;    
  168.     ST_ResFileSaver            resFileSaver (CurResFile ());
  169.     
  170.     OSErr    error = OpenClippingFile (id, fileRef);
  171.     if (error)
  172.         return error;
  173.     
  174.     ST_ResFileCloser        resFileCloser (fileRef);
  175.     
  176.     UseResFile (fileRef);
  177.     data = (FlyPaperAuxDataHandle) Get1Resource (kAuxDataResType, kAuxDataResID);
  178.     if (!data)
  179.         return resNotFound;
  180.  
  181.     DetachResource ((Handle) data);
  182.     return noErr;
  183. }
  184.  
  185. OSErr    DeleteClippingFile (ClippingID id)
  186. {
  187.     FSSpec        spec;
  188.     OSErr        error = FlyPaperFindFolder (kOnSystemDisk, kClippingsFolder, true, &spec.vRefNum,
  189.                         &spec.parID);
  190.     if (error)
  191.         return error;
  192.         
  193.     NumToString (id, spec.name);
  194.     return FSpDelete (&spec);
  195. }
  196.  
  197.  
  198. OSErr    ClippingFileToDragReference (ClippingID id, DragReference& dragRef, Boolean loadit)
  199. {
  200.     ST_ResFileSaver                resFileSaver (CurResFile ());
  201.     short                        fileRef;
  202.     OSErr                        error = OpenClippingFile (id, fileRef);
  203.     if (error)
  204.         return error;
  205.         
  206.     ST_ResFileCloser             resFileCloser (fileRef);
  207.     
  208.     UseResFile (fileRef);
  209.     DragResourceHeader            header = (DragResourceHeader) Get1Resource (kDragResourceResType, kDragResourceResID);
  210.     
  211.     if (!header)
  212.         return resNotFound;
  213.     
  214.     error = NewDrag (&dragRef);
  215.     if (error)
  216.         return error;
  217.  
  218.     ST_DragReference            theDragRef (dragRef);
  219.     
  220.     if (!loadit) {        
  221.         error = SetDragSendProc (dragRef, gMySendDataProc, 0);
  222.         if (error)
  223.             return error;
  224.     }
  225.     
  226.     for (unsigned short whichFlavor = 0; whichFlavor < (**header).flavorCount; ++whichFlavor) {
  227.         FlavorType                    flavor;
  228.         Handle                        flavorHandle;
  229.         
  230.         flavor = (**header).flavors [whichFlavor].flavorType;
  231.         if (loadit) {
  232.             // TempGet1Resource returns a tempmem handle, not a resource handle
  233.             ST_Handle                flavorHandle = TempGet1Resource (flavor, kFlavorResID);
  234.             if ((Handle) flavorHandle == nil) {
  235.                 return resNotFound;
  236.             }
  237.             
  238.             error = AddDragItemFlavor (dragRef, (ItemReference) id, flavor, *(Handle)flavorHandle,
  239.                     GetHandleSize ((Handle) flavorHandle), 0);
  240.             if (error)
  241.                 return error;
  242.         } else
  243.             return memFullErr;
  244.             
  245. #if 0            // Doesn't seem to work if I am bg-only. :-(  error -600
  246.          else {
  247.             error = AddDragItemFlavor (dragRef, (ItemReference) id, flavor, nil, 1, 0);
  248.             if (error)
  249.                 return error;
  250.         }
  251. #endif
  252.  
  253.     }
  254.     
  255.     if (error == noErr) {
  256.         theDragRef.Forget ();
  257.         return noErr;
  258.     } else {
  259.         return error;
  260.     }
  261. }
  262.  
  263. OSErr    ExtractFlavorFromClippingFile (ClippingID id, FlavorType whichFlavor, Handle &outHandle)
  264. {    
  265.     ST_ResFileSaver                resFileSaver (CurResFile ());
  266.     short                        fileRef;
  267.     OSErr                        error = OpenClippingFile (id, fileRef);
  268.     if (error)
  269.         return error;
  270.         
  271.     ST_ResFileCloser             resFileCloser (fileRef);
  272.     
  273.     UseResFile (fileRef);
  274.     DragResourceHeader            header = (DragResourceHeader) Get1Resource (kDragResourceResType, kDragResourceResID);
  275.     if (!header)
  276.         return resNotFound;
  277.         
  278.     unsigned short index;
  279.     
  280.     for (index = 0; index < (**header).flavorCount; ++index) {
  281.         if ((**header).flavors [index].flavorType == whichFlavor)
  282.             break;
  283.     }
  284.     
  285.     if (index == (**header).flavorCount)
  286.         return cantGetFlavorErr;
  287.         
  288.     outHandle = TempGet1Resource (whichFlavor, kFlavorResID);        // not a resource handle
  289.     
  290.     if (outHandle == 0)
  291.         return memFullErr;
  292.     else {
  293.         return noErr;
  294.     }
  295. }
  296.  
  297. static
  298. pascal OSErr ClippingSendDataProc (FlavorType theType, void *dragSendRefCon, ItemReference theItemRef,
  299.     DragReference theDragRef)
  300. {        
  301.     long            oldA5 = SetA5 ((long) dragSendRefCon);
  302.     Handle            data;
  303.     OSErr            error = ExtractFlavorFromClippingFile ((ClippingID) theItemRef, theType, data);
  304.  
  305.     if (error)
  306.         goto Exit;
  307.     
  308.     long            size = GetHandleSize (data);
  309.     HLock (data);
  310.     
  311.     error = SetDragItemFlavorData (theDragRef, theItemRef, theType, *data, size, 0);
  312.     DisposeHandle (data);
  313.     
  314.     
  315. Exit:
  316.     SetA5 (oldA5);
  317.     return error;
  318. }
  319.  
  320. Boolean InitClippingFile (void)
  321. {
  322.     gMySendDataProc = NewDragSendDataProc (ClippingSendDataProc);
  323.     if (!gMySendDataProc)
  324.         return false;
  325.     else
  326.         return true;
  327. }
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.